/*
 * Copyright (c) 2008, University of Aarhus.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the name of the University of Aarhus nor the names
 *   of its contributors may be used to endorse or promote products derived
 *   from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @author: Morten Tranberg Hansen <mth@cs.au.dk>
 * @date:   October 16 2008	
 * 
 */

package dk.sensobyg.base;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Map;

public class TextBasedClient implements Runnable {

	Admin admin;
	SensorNetwork network;
	
	public TextBasedClient(Admin admin, SensorNetwork network) {
		this.admin = admin;
		this.network = network;
	}
	
	public void run() {

		printHelp();
		
		BufferedReader console = new BufferedReader( new InputStreamReader( System.in ) );
		boolean quit = false;
		while(!quit) {
		    String input = "";
		    try {
		    	input = console.readLine();
		    } catch(IOException e) {
		    	System.out.println(e);
		    }
		    
		    if(input==null) continue;
		    
		    String[] parts = input.split(" ");
            String cmd = parts[0];
            
            if(cmd.equals("help")) {
            	printHelp();
            } else if(cmd.equals("quit") || cmd.equals("exit")) {
            	quit = true;
            } else if(cmd.equals("latest")) {
            	if(parts.length<2) {
            		System.out.println("You need to specifiy a sensorid.");
            		continue;
            	}
            	try {
            		SensorData data = network.getLatest(Long.parseLong(parts[1]));
            		if(data!=null) System.out.println("Time: " + new Date(data.getTimestamp()) + ", Data: " + data.getData());
            		else System.out.println("No data.");
            	} catch(NumberFormatException e) {
            		System.out.println(e);
            	}
            } else if(cmd.equals("wrappers")) {
            	Map<Integer,String> wrappers = admin.getWrappers(); 
            	if(wrappers.size()==0) System.out.println("No Wrappers.");
            	else {
            		for(Integer id : wrappers.keySet()) {
            			System.out.println("" + id + ": " + wrappers.get(id));
            		}
            	}
            } else if(cmd.equals("sample")) {
            	if(parts.length<3) {
            		System.out.println("You need to specifiy a sample rate in ms and a wrapper ID.");
            		continue;
            	}
            	try {
            		int wrapperid = Integer.parseInt(parts[1]);
            		long interval = Long.parseLong(parts[2]);
            		System.out.println("Setting sample rate to " + interval);
                	Configuration c = new Configuration(ConfigurationType.SAMPLE_INTERVAL, interval);
            		admin.configure(wrapperid, c);
            	} catch(NumberFormatException e) {
            			System.out.println(e);
            	} catch(IllegalArgumentException e) {
            			System.out.println(e);
            	}
            }
		}
	}
	
	public void printHelp() {
		System.out.println("Availiable commands:");
		System.out.println("  help");
		System.out.println("  quit|exit");
		System.out.println("  latest <sensorid>");
		System.out.println("  wrappers");
		System.out.println("  sample <wrapperid> <interval>");
	}
	

}
